package cn.jnetty.ioc.remoting;
import cn.jnetty.api.JnettyHandler;
import cn.jnetty.api.handler.RouterHandler;
import cn.jnetty.api.handler.MethodHandler;
import cn.jnetty.ioc.mapping.JRequestDefinitionBeanFactory;
import cn.jnetty.remoting.code.JnettyTcpWrapperIoMessage;
import io.netty.channel.ChannelHandlerContext;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 猪哥亮
 * @email 1030681978@qq.com
 * @date 2020/4/9 13:14
 * 描述：
 */
public class DefaultJnettyTcpHandler implements JnettyHandler<JnettyTcpWrapperIoMessage> {
    @Override
    public void channelRead0(ChannelHandlerContext channelHandlerContext, JnettyTcpWrapperIoMessage jnettyTcpWrapperIoMessage) throws Exception {
        String path = jnettyTcpWrapperIoMessage.getModule() + "/" + jnettyTcpWrapperIoMessage.getCmd();
        //获取路由处理器
        RouterHandler bean = JRequestDefinitionBeanFactory.getInstance().getBean(path);
        if (bean == null) {
            return;
        }
        //方法执行前拦截器
        boolean b =  bean.getHandlerInterceptor().preMethod(channelHandlerContext,jnettyTcpWrapperIoMessage);
        if(!b){
            //被拦截了
            return;
        }
//        List list = new ArrayList<>();
//        list.add(jnettyTcpWrapperIoMessage.getMsg());
//        MethodHandler inove = bean.inove(list);
//        if(bean.getJExcutors() != null){
//            bean.getJExcutors().excutor(() -> {
//                Object invoke = inove.invoke(list);
//                byte[] encode = (byte[]) bean.getParameterHandler().encode(invoke);
//                channelHandlerContext.channel().writeAndFlush(encode);
//                //方法执行后拦截器
//                bean.getHandlerInterceptor().afterMethod(channelHandlerContext,jnettyTcpWrapperIoMessage);
//            },channelHandlerContext,jnettyTcpWrapperIoMessage);
//        }else {
//            Object invoke = inove.invoke(list);
//            byte[] encode = (byte[]) bean.getParameterHandler().encode(invoke);
//            channelHandlerContext.channel().writeAndFlush(encode);
//            //方法执行后拦截器
//            bean.getHandlerInterceptor().afterMethod(channelHandlerContext,jnettyTcpWrapperIoMessage);
//        }
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

    }
}
